package ch.penas.business.service;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;

import ch.penas.business.dom.Formateur;

/** @author Daniel */
public class FormateurServiceImpl extends UtilisateurAbstractMYSQL implements
			 FormateurService, Serializable {

	/** Serialisation de la class pour une question de securiter. */
	private static final long serialVersionUID = -6797092500849314538L;

	private List<Formateur> mFormateurList;

	private Formateur tempsRechercheFormateur = new Formateur();

	public FormateurServiceImpl() {
		this.mFormateurList = new ArrayList<Formateur>();
	}

	public final List<Formateur> getAll() {
		try {
			initFixture();
		} catch (Exception e) {
			e.printStackTrace();
		}
		this.mFormateurList.removeAll(mFormateurList);
		getEntityTransaction().begin();

		Query query = getEntityManager().createQuery(
				"SELECT e FROM Formateur e");

		List<Formateur> b = query.getResultList();
		for (Formateur a : b) {
			this.tempsRechercheFormateur = a;
			this.addRecherche(this.getTempsRechercheFormateur());
		}

		getEntityTransaction().commit();

		try {
			closeEntityManager();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return this.mFormateurList;
	}

	public final void update(Formateur formateur) {
		try {
			initFixture();

			getEntityTransaction().begin();
			Formateur genre = getEntityManager().find(
				Formateur.class, formateur.getIdUtilisateur());

			if (formateur.getUser() != "") {
				genre.setUser(formateur.getUser());
			}
			if (formateur.getNom() != "") {
				genre.setNom(formateur.getNom());
			}
			if (formateur.getPrenom() != "") {
				genre.setPrenom(formateur.getPrenom());
			}
			if (formateur.getAdresse() != "") {
				genre.setAdresse(formateur.getAdresse());
			}
			if (formateur.getNumeroFixe() != "") {
				genre.setNumeroFixe(formateur.getNumeroFixe());
			}
			if (formateur.getNumeroNatel() != "") {
				genre.setNumeroNatel(formateur.getNumeroNatel());
			}
			if (formateur.getMail() != "") {
				genre.setMail(formateur.getMail());
			}
			if (formateur.getPassword() != "") {
				genre.setPassword(formateur.getPassword());
			}
			getEntityTransaction().commit();

			closeEntityManager();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public final void add(final Formateur formateur) {
		try {
			initFixture();

			getEntityTransaction().begin();
			getEntityManager().persist(formateur);
			getEntityTransaction().commit();

			closeEntityManager();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public final int getNbFormateur() {
		Object resultQuery;
		try {
			initFixture();
		} catch (Exception e) {
			e.printStackTrace();
		}
		getEntityTransaction().begin();

		Query query = getEntityManager().createQuery(
				"SELECT COUNT(e.user) FROM Formateur e");

		resultQuery = query.getSingleResult();

		getEntityTransaction().commit();

		try {
			closeEntityManager();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return Integer.parseInt(resultQuery.toString());
	}

	public void del(Formateur mDeleteUtilisateur) {
		try {
			initFixture();

			getEntityTransaction().begin();
			Formateur userx = getEntityManager().find(
				Formateur.class, mDeleteUtilisateur.getUser());
			getEntityManager().remove(userx);
			getEntityTransaction().commit();

			closeEntityManager();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public final void addRecherche(final Formateur sesultQuery2) {
		this.mFormateurList.add(sesultQuery2);
	}

	public final Formateur getTempsRechercheFormateur() {
		return this.tempsRechercheFormateur;
	}
}